随机森林与Adaptive Boosted决策树简介
总体概览
- 随机森林
- Adaptive Boosted Decision Tree
这两个模型都是对决策树模型的聚合. 但是出发的思路却是不同的.
随机森林
基本算法,简单说就是对决策树做BAGGING.
给定训练数据集$D$, 设一共建$T$棵树.
For t = 1, 2, … T
- 从数据集$D$中,用可重复采样方式采样$N$个样本得到数据集$D_t$,这一步是bootstrapping
- 用采样后的数据集建立一个随机化的决策树.这里随机化除了上一步中的随机采样,每一个决策树还可以随机选取数据中的特征(feature)
最后对得到的所有的决策树做uniform的平均
随机森林有几个有趣的性质
- 可以自带校验self-validation, 这是因为在做bootstrapping采样的时候对于任何一个树都会有一部样本是采样不到的. 这些可以用out-of-bagging的方法来对Validation做出估计
- 可以用permution test对数据集中的不同特征计算出该特征的重要性.
- 对于一个完全长成的决策树,一般来说都是会过拟合的. 所以决策树是需要剪枝的. 而随机森林中的uniform的平均就可以很好的克服过拟合overfitting.
随机森林一般来说就是算比较强的算法, 个人感觉比max margin的SVM可能稍微弱一点. 尽管多个树的平均有近似max margin的效果.
不过随机森林是基于决策树的方法, 所以也继承了决策树的好处.
- 对于生成的结果可解释性较好
- 对于非数值型的特征比较好处理
- 也能对缺失数据进行处理
- …
最后的问题是, 能不能改进一下最后的结果不用平均,而是某种加权平均来增强性能呢, 譬如用AdaBoost的聚合方法来增强
Adaptive Boosted Decision Tree
基本算法
给定训练数据集$D$, 设一共建$T$棵树.
For t = 1, 2, … T
- 从数据集$D$中,对每个样本计算权重$u^{(t)}$
- 用加权后的样本数据来计算得到一个决策树$DTree(D,u^{(t)})$
- 对获得的决策树计算其投票权重
最后对所有获得的决策树进行加权线性合并.
加权的训练错误的两种表达方式
- 一种是用样本的权重
- 另一种是用权重采样后得到的数据集表示. 这种表示中,例如一个权重为2的样本,在采样后的数据集中就会有2份
样本权重的选择
对于AdaBoost这种聚合模型,关于权重的选择,启发式的思路是去保持单个的分类器多样性的最大化.
这种多样性的最大化是让在第t轮产生的分类器在t+1轮采样出的样本性能非常的不好.这样由t+1轮样本训练出的分类器就与第t轮的分类器非常的不同.
第t轮的分类器
第t+1轮的分类器
对于$u_n^{(t+1)}$的构建是让$g_t$在$u_n^{(t+1)}$的样本权重下性能很差. 即让下式成立
设$g_t$在第t轮的加权错误率为$\epsilon$, 则其正确率为$1-\epsilon$.
则第t+1轮的权重更新规则为:
对于$g_t$分类错误的样本,
对于$g_t$分类正确的样本,
从上式可以得出,对于$g_t$在新的样本权重下,即$u_n^{t+1}$,其加权错误率为1/2. 这样下一轮训练出的分类器就与$g_t$很不同,并且’着重’点在$g_t$犯错的样本上.
补充:
- 样本的初始权重为均匀分布,每个样本权重都为$1/N$
- 实际使用中是定义缩放因子, 错误样本的权重乘以缩放因子,而正确样本的权重要除以缩放因子.
缩放因子的意义在于,如果$\epsilon < 1/2$,则’错误样本权重放大’且’正确样本权重减小’
线性合并的权重
线性合并的权重计算的思路是对于某个好的分类器其权重大,而差的分类器权重要小. AdaBoost的作者给出的权重计算公式为
意义在于
- 如果$\epsilon=\frac{1}{2}$,则该分类器的权重为0
- 如果$\epsilon=0$,则该分类器的权重为无穷大
- 如果$\epsilon<\frac{1}{2}$,则该分类器的权重为负值
总结
随机森林与AdaBoost Decision Tree都是对决策树的聚合模型, 但是两者的思路是有区别的
- 随机森林是用完全长成的树,每个分类器是强分类器,训练错误很小但是是过拟合的.采用平均的方法来克服过拟合,也就是减小variance
- AdaBoost Decision Tree是用弱分类器,每个决策树都是’浅’的树,在生成这些树的时候一般是要限制树的高度. 单个分类器一般都是欠拟合的.
总体感觉AdaBoost Decision Tree的构思更巧妙一些,个人觉得AdaBoost Decision Tree应该性能更好一些
Gradient Boost是AdaBoost的更一般化模型, 支持任意可微分的代价函数.
2014年在kaggle竞赛上出现的xgboost性能很强,多次在kaggle获得很好的结果.